<?php 

/**
 * 连接上下文操作
 * @package Helper
 * @author Chengxuan <chengxuan@leju.sina.com.cn>
 * @version #Id:conetxt.php 2010-5-14 上午10:40:48#
 */

final class Cls_Context
{
	/**
	 * 数值(类型)
	 * @var int
	 */
	const T_INT = 1;
	
	/**
	 * 数字(类型)
	 * @var int
	 */
	const T_NUMBER = 2;
	
	/**
	 * 单精度(类型)
	 * @var int
	 */
	const T_FLOAT = 3;
	
	/**
	 * 双精度(类型)
	 * @var int
	 */
	const T_DOUBLE = 4;
	
	/**
	 * 字符串(类型)
	 * @var int
	 */
	const T_STRING = 5;
	
	/**
	 * 数组(类型)
	 * @var int
	 */
	const T_ARRAY = 6;
	
	/**
	 * 布尔型(类型)
	 * @var int
	 */
	const T_BOOL = 7;

	/**
	 * 构造方法（锁定只能允许一个实例）
	 */
	protected function __construct() {}
	
	/**
	 * 初始化对象
	 * @return Cls_Context
	 */
	static public function init()
	{
		static $context = null;
		$context === null && $context = new self;
		return $context;
	}
	
	/**
	 * 取得提交的查询数据
	 * @param string $key	提交查询的键名
	 * @return mixed
	 */
	public function __get($key)
	{
		return $this->request($key);
	}
	
	/**
	 * 取得REQUEST方式提交的数据
	 * @param mixed	$key	查询名称
	 * @param int	$type	指定数据类型(Cls_Context::T_*)
	 * @return mixed
	 */
	public function request($key, $type=null)
	{
		$result = isset($_REQUEST[$key]) ? $_REQUEST[$key] : null;
		return $this->validate($result, $type);
	}
	
	/**
	 * 取得POST方式提交的数据
	 * @param mixed	$key	查询名称
	 * @param int	$type	指定数据类型(Cls_Context::T_*)
	 * @return mixed
	 */
	public function post($key, $type=null)
	{
		$result = isset($_POST[$key]) ? $_POST[$key] : null;
		return $this->validate($result, $type);
	}
	
	/**
	 * 取得GET方式提交的数据
	 * @param mixed	$key	查询名称
	 * @param int	$type	指定数据类型(Cls_Context::T_*)
	 * @return mixed
	 */
	public function get($key, $type=null)
	{
		$result = isset($_GET[$key]) ? $_GET[$key] : null;
		return $this->validate($result, $type);
	}
	
	/**
	 * 取得COOKIE方式提交的数据
	 * @param mixed	$key	查询名称
	 * @param int	$type	指定数据类型(Cls_Context::T_*)
	 * @return mixed
	 */
	public function cookie($key, $type=null)
	{
		$result = isset($_COOKIE[$key]) ? $_COOKIE[$key] : null;
		return $this->validate($result, $type);
	}
	
	/**
	 * 根据提供的数据和类型，返回验证后的类型
	 * @param mixed	$value	数值
	 * @param int	$type	验证类型
	 * @return mixed		验证后的数值
	 */
	public function validate($value, $type=null)
	{
		switch($type)
		{
			//数值
			case self::T_INT :
				return (int)$value;
			
			//数字
			case self::T_NUMBER :
				return Cls_Validator::is_num($value) ? $value : '0';
			
			//浮点数
			case self::T_FLOAT :
			case self::T_DOUBLE :
				return (float)$value;
			
			//字符串
			case self::T_STRING :
				return (string)$value;
				
			//数组
			case self::T_ARRAY :
				return is_array($value) ? $value : array();
			
			//布尔型
			case self::T_BOOL :
				return $value == 'false' ? false : (boolean)$value;
		}
		return $value;
	}
	
	/**
	 * 输出数据
	 * @param mixed		$data		数据内容
	 * @param string	$type		输出格式(json/jsonp/jsonu/jsonup/yaml/serialize)
	 * @param string	$callback	jsonp/jsonup的回调函数
	 * @param boolean	$return		是否返回数据而不输出数据
	 * @param string	$charset	输出编码(默认为GBK)
	 * @return string
	 */
	public function outputData($data, $type='serialize', $callback=false, $return=false, $charset='utf-8')
	{
    	if($charset != 'utf-8')
    	{
    		eval('$data='.mb_convert_encoding(var_export($data,1).';', $charset, 'utf-8'));
    	}
		switch(strtolower($type))
		{
			//JSON，中文为明文数据
			case 'json' :
			case 'jsonp' :
				$json = new Cls_JSON;
				$result = $json->encode($data);
				break;
			
			//JSON，中文为Unicode编码数据
			case 'jsonu' :
			case 'jsonup' :
				$result = Cls_JSON::en($data, 'utf-8');
				break;
				
			//YAML格式数据
//			case 'yaml' :
//				$result = Cls_Spyc::YAMLDump($data);
//				break;
				
			//PHP序列化数据
			default :
				$result = serialize($data);
				break;
		}
		
		if(($type == 'jsonp' || $type == 'jsonup') && $callback)
		{
			$result = "{$callback}({$result})";
		}
		
		if($return) return $result;
		echo $result;
	}
}